using System.Text.Json.Serialization;

namespace SmartMedicalRAG.Core.Models;

/// <summary>
/// 患者数据模型 - 定义患者的基本信息和多模态数据
/// 作用：统一管理患者的所有相关数据，包括基本信息、症状、生命体征等
/// 包含：患者主诉、症状列表、生命体征、病史、多模态处理数据
/// 用途：作为 RAG 系统的输入数据格式，支持智能分诊分析
/// </summary>
public class PatientData
{
    /// <summary>
    /// 患者唯一标识符 - 自动生成的 GUID
    /// 作用：唯一标识每个患者的数据记录
    /// 格式：标准 GUID 字符串
    /// 示例："12345678-1234-1234-1234-123456789abc"
    /// </summary>
    public string Id { get; set; } = Guid.NewGuid().ToString();
    
    /// <summary>
    /// 患者主诉 - 患者的主要症状描述
    /// 作用：记录患者的主要不适症状，是分诊的重要依据
    /// 内容：患者自述的主要症状和不适感
    /// 示例："头痛、恶心、呕吐，持续3天"
    /// </summary>
    public string? ChiefComplaint { get; set; }
    
    /// <summary>
    /// 症状列表 - 患者的所有症状
    /// 作用：详细记录患者的各种症状，用于综合分析
    /// 内容：具体的症状描述列表
    /// 示例：["头痛", "恶心", "呕吐", "发热", "食欲不振"]
    /// </summary>
    public List<string> Symptoms { get; set; } = new();
    
    /// <summary>
    /// 生命体征 - 患者的生理指标
    /// 作用：记录血压、心率、体温等关键生理指标
    /// 包含：血压、心率、体温、呼吸频率、血氧饱和度
    /// 用途：评估患者的生理状态和紧急程度
    /// </summary>
    public VitalSigns? VitalSigns { get; set; }
    
    /// <summary>
    /// 病史 - 患者的既往病史
    /// 作用：记录患者的疾病史、过敏史、用药史等
    /// 内容：既往疾病、手术史、过敏史、家族史等
    /// 用途：辅助判断当前症状与既往疾病的关系
    /// 示例："高血压病史5年，糖尿病史2年，对青霉素过敏"
    /// </summary>
    public string? MedicalHistory { get; set; }
    
    /// <summary>
    /// 处理后的多模态数据 - 经过 AI 处理的各种类型数据
    /// 作用：存储经过文本、语音、图像、生理信号处理后的结构化数据
    /// 包含：文本实体、语音转文本、图像特征、生理信号分析结果
    /// 用途：为 RAG 系统提供结构化的知识输入
    /// </summary>
    public List<ProcessedData> ProcessedData { get; set; } = new();
    
    /// <summary>
    /// 创建时间 - 数据记录创建的时间戳
    /// 作用：记录数据创建的时间，用于数据管理和审计
    /// 格式：UTC 时间戳
    /// 示例："2024-01-15T10:30:00Z"
    /// </summary>
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

/// <summary>
/// 生命体征模型 - 定义患者的生理指标数据
/// 作用：标准化生命体征的数据格式，包含关键的生理参数
/// 包含：血压、心率、体温、呼吸频率、血氧饱和度
/// 用途：评估患者的生理状态、判断紧急程度、监测病情变化
/// </summary>
public class VitalSigns
{
    /// <summary>
    /// 血压 - 患者的血压值
    /// 作用：评估心血管系统状态
    /// 格式：收缩压/舒张压 mmHg
    /// 示例："120/80"、"140/90"
    /// 正常范围：收缩压 90-140 mmHg，舒张压 60-90 mmHg
    /// </summary>
    public string? BloodPressure { get; set; }
    
    /// <summary>
    /// 心率 - 患者的心跳频率
    /// 作用：评估心脏功能和循环状态
    /// 单位：次/分钟 (bpm)
    /// 示例：72、85、120
    /// 正常范围：60-100 bpm（成人静息状态）
    /// </summary>
    public int HeartRate { get; set; }
    
    /// <summary>
    /// 体温 - 患者的体温值
    /// 作用：评估感染和炎症状态
    /// 单位：摄氏度 (°C)
    /// 示例：36.5、37.2、38.5
    /// 正常范围：36.0-37.5 °C
    /// </summary>
    public decimal Temperature { get; set; }
    
    /// <summary>
    /// 呼吸频率 - 患者的呼吸次数
    /// 作用：评估呼吸系统功能和氧合状态
    /// 单位：次/分钟
    /// 示例：16、20、25
    /// 正常范围：12-20 次/分钟（成人）
    /// </summary>
    public int RespiratoryRate { get; set; }
    
    /// <summary>
    /// 血氧饱和度 - 血液中氧气的饱和度
    /// 作用：评估氧合状态和呼吸功能
    /// 单位：百分比 (%)
    /// 示例：98、95、88
    /// 正常范围：95-100%
    /// 警告：低于 90% 需要立即关注
    /// </summary>
    public int OxygenSaturation { get; set; }
}

/// <summary>
/// 处理后数据模型 - 定义经过 AI 处理的多模态数据
/// 作用：存储各种类型数据经过 AI 处理后的结构化结果
/// 包含：文本实体、语音转文本、图像特征、生理信号分析
/// 用途：为 RAG 系统提供结构化的知识输入，支持智能分析
/// </summary>
public class ProcessedData
{
    /// <summary>
    /// 数据类型 - 标识数据的来源类型
    /// 作用：区分不同类型的数据处理结果
    /// 可能值：Text（文本）、Voice（语音）、Image（图像）、PhysiologicalSignal（生理信号）
    /// 用途：根据数据类型选择相应的处理策略
    /// </summary>
    public DataType Type { get; set; }
    
    /// <summary>
    /// 处理后的内容 - AI 处理后的主要结果
    /// 作用：存储 AI 处理后的核心内容
    /// 文本：提取的关键信息、摘要
    /// 语音：转写的文本内容
    /// 图像：识别的病变描述、特征
    /// 生理信号：异常检测结果、趋势分析
    /// 示例："患者主诉头痛，伴有恶心呕吐，体温38.2°C"
    /// </summary>
    public string? Content { get; set; }
    
    /// <summary>
    /// 实体列表 - 从数据中提取的医学实体
    /// 作用：存储从数据中识别出的医学概念和实体
    /// 包含：症状、疾病、药物、解剖部位、检查项目等
    /// 示例：["头痛", "恶心", "呕吐", "发热", "脑膜炎"]
    /// 用途：支持医学知识图谱构建和语义检索
    /// </summary>
    public List<string> Entities { get; set; } = new();
    
    /// <summary>
    /// 置信度 - 处理结果的可靠程度
    /// 作用：量化 AI 处理结果的可靠程度
    /// 范围：0.0-1.0（0% 到 100%）
    /// 示例：0.85 表示 85% 的置信度
    /// 用途：帮助医生评估 AI 分析结果的可信度
    /// </summary>
    public float Confidence { get; set; }
    
    /// <summary>
    /// 分割结果 - 图像分割的处理结果
    /// 作用：存储医学图像分割的结果（仅图像数据）
    /// 包含：病变区域、器官分割、异常区域标记等
    /// 用途：支持医学影像的精确分析和诊断
    /// 注意：此字段在 JSON 序列化时会被忽略
    /// </summary>
    [JsonIgnore]
    public object? Segmentation { get; set; }
    
    /// <summary>
    /// 特征向量 - 提取的特征数据
    /// 作用：存储从数据中提取的特征向量
    /// 包含：文本特征、图像特征、语音特征、生理信号特征
    /// 用途：支持相似性计算和模式识别
    /// 注意：此字段在 JSON 序列化时会被忽略
    /// </summary>
    [JsonIgnore]
    public object? Features { get; set; }
    
    /// <summary>
    /// 异常检测结果 - 生理信号的异常检测
    /// 作用：存储生理信号中的异常检测结果（仅生理信号数据）
    /// 包含：异常模式、异常时间点、异常严重程度等
    /// 用途：支持生理信号的智能监控和预警
    /// 注意：此字段在 JSON 序列化时会被忽略
    /// </summary>
    [JsonIgnore]
    public object? Anomalies { get; set; }
    
    /// <summary>
    /// 时间序列分析结果 - 生理信号的时间序列分析
    /// 作用：存储生理信号的时间序列分析结果
    /// 包含：趋势分析、周期性分析、预测结果等
    /// 用途：支持生理信号的趋势预测和长期监测
    /// 注意：此字段在 JSON 序列化时会被忽略
    /// </summary>
    [JsonIgnore]
    public object? TimeSeriesAnalysis { get; set; }
    
    /// <summary>
    /// 语义理解结果 - 文本的语义理解结果
    /// 作用：存储文本的语义理解和意图识别结果
    /// 包含：情感分析、意图识别、语义相似度等
    /// 用途：支持更深入的文本理解和分析
    /// 注意：此字段在 JSON 序列化时会被忽略
    /// </summary>
    [JsonIgnore]
    public object? SemanticUnderstanding { get; set; }
}

/// <summary>
/// 数据类型枚举 - 定义多模态数据的类型
/// 作用：标识不同来源和类型的数据
/// 包含：文本、语音、图像、生理信号四种主要类型
/// 用途：指导 AI 系统选择相应的处理算法和策略
/// </summary>
public enum DataType
{
    /// <summary>
    /// 文本数据 - 结构化的文本信息
    /// 包含：患者主诉、医生记录、病史、检查报告等
    /// 处理：NLP 技术、实体识别、语义分析
    /// </summary>
    Text,
    
    /// <summary>
    /// 语音数据 - 患者的语音输入
    /// 包含：患者语音描述、症状描述、医生语音记录等
    /// 处理：语音识别、语音转文本、情感分析
    /// </summary>
    Voice,
    
    /// <summary>
    /// 图像数据 - 医学影像和照片
    /// 包含：X光片、CT、MRI、皮肤病变照片等
    /// 处理：图像分割、特征提取、病变识别
    /// </summary>
    Image,
    
    /// <summary>
    /// 生理信号数据 - 生理监测数据
    /// 包含：心电图、血压监测、体温曲线、血氧监测等
    /// 处理：异常检测、时间序列分析、趋势预测
    /// </summary>
    PhysiologicalSignal
}

/// <summary>
/// 生理数据模型 - 定义生理信号的数据格式
/// 作用：标准化生理信号的数据结构，支持时间序列分析
/// 包含：数据类型、数值序列、时间戳、单位信息
/// 用途：支持心电图、血压、体温等生理信号的智能分析
/// </summary>
public class PhysiologicalData
{
    /// <summary>
    /// 数据类型 - 生理信号的类型标识
    /// 作用：标识具体的生理信号类型
    /// 可能值：ECG（心电图）、BP（血压）、Temp（体温）、SpO2（血氧）等
    /// 示例："ECG"、"BP"、"Temp"、"SpO2"
    /// 用途：指导相应的信号处理算法
    /// </summary>
    public string Type { get; set; } = string.Empty;
    
    /// <summary>
    /// 数据值序列 - 生理信号的数值数据
    /// 作用：存储生理信号的时间序列数值
    /// 格式：数值数组，与时间戳一一对应
    /// 示例：[72, 75, 78, 71, 74, 76, 73, 75, 77, 72]
    /// 用途：支持信号分析、异常检测、趋势预测
    /// </summary>
    public List<double> Values { get; set; } = new();
    
    /// <summary>
    /// 时间戳序列 - 数据采集的时间点
    /// 作用：记录每个数据值对应的时间点
    /// 格式：DateTime 数组，与数值一一对应
    /// 示例：["2024-01-15T10:00:00Z", "2024-01-15T10:01:00Z", ...]
    /// 用途：支持时间序列分析和趋势预测
    /// </summary>
    public List<DateTime> Timestamps { get; set; } = new();
    
    /// <summary>
    /// 数据单位 - 数值的计量单位
    /// 作用：标识数值的计量单位，确保数据理解正确
    /// 示例："bpm"（心率）、"mmHg"（血压）、"°C"（体温）、"%"（血氧）
    /// 用途：支持数据的标准化和比较分析
    /// </summary>
    public string? Unit { get; set; }
} 